package com.demo.state19;

/**
 * @author gy
 * @date 2022/6/10
 * 通过客户的动作将每个状态整合起来，实现这个功能最简单的方式肯定是 if…else 啦！
 * 所以这里我们就通过动作将所有的状态全面整合起来。分析得这里有四个动作：预订、入住、退订、退房。如下：
 */
public class Example01 {
    /**
     * 当第一眼看到这个系统时你就看出这是一个状态图，每个框都代表了房间的状态，箭头表示房间状态的转换。
     * 分析如下：房间有三个状态：空闲、已预订、已入住，状态与状态之间可以根据客户的动作来进行转换，
     * 定义每个状态的值。
     */
    public static final int FREEMTIME_STATE = 0;  //空闲状态
    public static final int BOOKED_STATE = 1;     //已预订状态
    public static final int CHECKIN_STATE = 2;    //入住状态

    int state = FREEMTIME_STATE;     //初始状态

    public static int count ;    //房间数量


    /**
     * @desc 预订
     */
    public void bookRoom(){
        if(state == FREEMTIME_STATE){   //空闲可预订
            if(count > 0){
                System.out.println("空闲房间，完成预订...");
                state =  BOOKED_STATE;     //改变状态：已预订
                count --;
                //房间预订完了,提示客户没有房源了
                if(count == 0){
                    System.out.println("不好意思,房间已经预订完,欢迎您下次光临...");
                }
            }
            else{
                System.out.println("不好意思,已经没有房间了....");
            }
        }
        else if(state == BOOKED_STATE){
            System.out.println("该房间已经被预订了...");
        }
        else if(state == CHECKIN_STATE){
            System.out.println("该房间已经有人入住了...");
        }
    }

    /**
     * @desc 入住
     */
    public void checkInRoom(){
        if(state == FREEMTIME_STATE){
            if(count > 0){
                System.out.println("空闲房间，入住...");
                state =  CHECKIN_STATE;     //改变状态：已预订
                count --;
                //房间预订完了,提示客户没有房源了
                if(count == 0){
                    System.out.println("不好意思,房间已经预订完,欢迎您下次光临...");
                }
            }
            else{
                System.out.println("不好意思,已经没有房间了....");
            }

        }
        else if(state == BOOKED_STATE){
            // 此处需要业务处理
            if(true){//"如果该房间是您预订的"
                System.out.println("入住....");
                state = CHECKIN_STATE;
            }
            else{
                System.out.println("您没有预订该房间,请先预订...");
            }
        }
        else if(state == CHECKIN_STATE){
            System.out.println("该房间已经入住了...");
        }
    }

    /**
     * @desc 退订
     */
    public void unsubscribeRoom(){
        if(state == FREEMTIME_STATE){}
        else if(state == CHECKIN_STATE){}
        else if(state == BOOKED_STATE){
            System.out.println("已退订房间...");
            state = FREEMTIME_STATE;
            count ++;
        }
    }

    /**
     * @desc 退房
     */
    public void checkOutRoom(){
        if(state == FREEMTIME_STATE){}
        else if(state == BOOKED_STATE){}
        else if(state == CHECKIN_STATE){
            System.out.println("已退房..");
            state = FREEMTIME_STATE;
            count++;
        }
    }
}
